﻿using System.Collections.Generic;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;

namespace GigaSite.Domain.Interfaces.Repositories
{
    /// <summary>
    /// Репозиторий визиток
    /// </summary>
    public interface IBusinessCardsRepository: IBaseRepository<BusinessCard>
    {
        /// <summary>
        /// Добавляет визитку к указанному пользователю в визитницу
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="card">Визитка</param>
        /// <param name="mappingType">Тип владельчества, по умолчанию, визитка добавляется просто в визитницу</param>
        void AddBusinessCardToUser(User user, BusinessCard card,
                                   BusinessCardMappingTypes mappingType = BusinessCardMappingTypes.Holder);

        /// <summary>
        /// Убирает указанную визитку из визитницы пользователя
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="card">Визитка</param>
        void RemoveBusinessCardFromUser(User user, BusinessCard card);

        /// <summary>
        /// Добавляет указанную визитку в указанную категорию
        /// </summary>
        /// <param name="card">Визитка</param>
        /// <param name="category">Категория</param>
        void AddBusinessCardToCategory(BusinessCard card, Category category);

        /// <summary>
        /// Убирает указаную визитку из указанной категории
        /// </summary>
        /// <param name="card">Визитка</param>
        /// <param name="category">Категория</param>
        void RemoveBusinessCardFromCategory(BusinessCard card, Category category);

        /// <summary>
        /// Возвращает количество визиток, находящихся в указанной категории
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns></returns>
        int GetCardsCountInCategory(Category category);

        /// <summary>
        /// Возвращает все визитки, находящиеся в указанной категории, включая дочерние категории
        /// </summary>
        /// <param name="category">Категория</param>
        /// <returns>Коллекция визиток в категории</returns>
        IEnumerable<BusinessCard> GetAllCardsInCategory(Category category);
    }
}